package code12._type;

import org.junit.Test;

public class Test01 {
	@Test
	public void f1() {
		Person<String> p1 = new Person<String>();
		p1.pet = "宠物";
		
		Person<?> p2 = get2();
		Person p3 = get2();
		
	}
	// 简单的限定
	public static Person<Dog> get1() {
		return new Person<Dog>();
	}
	// 泛型使用时，可以使用通配符 ? 表示任意类型，即 Object
	public static Person<?> get2() {
		return new Person<Dog>();
	}
	// 返回一个 养 Pet(包括 Cat/Dog) 的人
	// 此处表示 Person传入的泛型只能是 Pet 或 Pet的子类(继承Pet的类)
	public static Person<? extends Pet> get3() {
		//return new Person<Dog>();// ok
		//return new Person<Cat>();// ok
		return new Person<Pet>();// ok
	}
	// 此处表示 Person传入的泛型只能是 Dog 或 Dog的超类
	public static Person<? super Dog> get4() {
		//return new Person<Dog>();// ok
		//return new Person<Cat>();// fail
		return new Person<Pet>();// ok
		//return new Person<BigDog>();// ok
	}
	
}
class Pet {}
class Cat extends Pet {}
class Dog extends Pet {}
class BigDog extends Dog {}

class Person<T> {
	public T pet;// 任意类型的宠物
}
// 在定义时，不能使用super
// 此处表示 Person传入的泛型只能是 Pet 或 Pet的子类(继承Pet的类)
class Person2<T extends Pet> {
	public T pet;
}

